home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Chapter 23 Character Animation / SkinnedMesh / ShadowMap.cpp < prev    next >
C/C++ Source or Header  |  2016-03-02  |  4KB  |  138 lines

  1. //***************************************************************************************
  2. // ShadowMap.cpp by Frank Luna (C) 2011 All Rights Reserved.
  3. //***************************************************************************************
  4.  
  5. #include "ShadowMap.h"
  6.  
  7. ShadowMap::ShadowMap(ID3D12Device* device, UINT width, UINT height)
  8. {
  9.     md3dDevice = device;
  10.  
  11.     mWidth = width;
  12.     mHeight = height;
  13.  
  14.     mViewport = { 0.0f, 0.0f, (float)width, (float)height, 0.0f, 1.0f };
  15.     mScissorRect = { 0, 0, (int)width, (int)height };
  16.  
  17.     BuildResource();
  18. }
  19.  
  20. UINT ShadowMap::Width()const
  21. {
  22.     return mWidth;
  23. }
  24.  
  25. UINT ShadowMap::Height()const
  26. {
  27.     return mHeight;
  28. }
  29.  
  30. ID3D12Resource*  ShadowMap::Resource()
  31. {
  32.     return mShadowMap.Get();
  33. }
  34.  
  35. CD3DX12_GPU_DESCRIPTOR_HANDLE ShadowMap::Srv()const
  36. {
  37.     return mhGpuSrv;
  38. }
  39.  
  40. CD3DX12_CPU_DESCRIPTOR_HANDLE ShadowMap::Dsv()const
  41. {
  42.     return mhCpuDsv;
  43. }
  44.  
  45. D3D12_VIEWPORT ShadowMap::Viewport()const
  46. {
  47.     return mViewport;
  48. }
  49.  
  50. D3D12_RECT ShadowMap::ScissorRect()const
  51. {
  52.     return mScissorRect;
  53. }
  54.  
  55. void ShadowMap::BuildDescriptors(CD3DX12_CPU_DESCRIPTOR_HANDLE hCpuSrv,
  56.                                  CD3DX12_GPU_DESCRIPTOR_HANDLE hGpuSrv,
  57.                                  CD3DX12_CPU_DESCRIPTOR_HANDLE hCpuDsv)
  58. {
  59.     // Save references to the descriptors. 
  60.     mhCpuSrv = hCpuSrv;
  61.     mhGpuSrv = hGpuSrv;
  62.     mhCpuDsv = hCpuDsv;
  63.  
  64.     //  Create the descriptors
  65.     BuildDescriptors();
  66. }
  67.  
  68. void ShadowMap::OnResize(UINT newWidth, UINT newHeight)
  69. {
  70.     if((mWidth != newWidth) || (mHeight != newHeight))
  71.     {
  72.         mWidth = newWidth;
  73.         mHeight = newHeight;
  74.  
  75.         BuildResource();
  76.  
  77.         // New resource, so we need new descriptors to that resource.
  78.         BuildDescriptors();
  79.     }
  80. }
  81.  
  82. void ShadowMap::BuildDescriptors()
  83. {
  84.     // Create SRV to resource so we can sample the shadow map in a shader program.
  85.     D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
  86.     srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
  87.     srvDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; 
  88.     srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
  89.     srvDesc.Texture2D.MostDetailedMip = 0;
  90.     srvDesc.Texture2D.MipLevels = 1;
  91.     srvDesc.Texture2D.ResourceMinLODClamp = 0.0f;
  92.     srvDesc.Texture2D.PlaneSlice = 0;
  93.     md3dDevice->CreateShaderResourceView(mShadowMap.Get(), &srvDesc, mhCpuSrv);
  94.  
  95.     // Create DSV to resource so we can render to the shadow map.
  96.     D3D12_DEPTH_STENCIL_VIEW_DESC dsvDesc; 
  97.     dsvDesc.Flags = D3D12_DSV_FLAG_NONE;
  98.     dsvDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
  99.     dsvDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
  100.     dsvDesc.Texture2D.MipSlice = 0;
  101.     md3dDevice->CreateDepthStencilView(mShadowMap.Get(), &dsvDesc, mhCpuDsv);
  102. }
  103.  
  104. void ShadowMap::BuildResource()
  105. {
  106.     // Note, compressed formats cannot be used for UAV.  We get error like:
  107.     // ERROR: ID3D11Device::CreateTexture2D: The format (0x4d, BC3_UNORM) 
  108.     // cannot be bound as an UnorderedAccessView, or cast to a format that
  109.     // could be bound as an UnorderedAccessView.  Therefore this format 
  110.     // does not support D3D11_BIND_UNORDERED_ACCESS.
  111.  
  112.     D3D12_RESOURCE_DESC texDesc;
  113.     ZeroMemory(&texDesc, sizeof(D3D12_RESOURCE_DESC));
  114.     texDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
  115.     texDesc.Alignment = 0;
  116.     texDesc.Width = mWidth;
  117.     texDesc.Height = mHeight;
  118.     texDesc.DepthOrArraySize = 1;
  119.     texDesc.MipLevels = 1;
  120.     texDesc.Format = mFormat;
  121.     texDesc.SampleDesc.Count = 1;
  122.     texDesc.SampleDesc.Quality = 0;
  123.     texDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
  124.     texDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
  125.  
  126.     D3D12_CLEAR_VALUE optClear;
  127.     optClear.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
  128.     optClear.DepthStencil.Depth = 1.0f;
  129.     optClear.DepthStencil.Stencil = 0;
  130.  
  131.     ThrowIfFailed(md3dDevice->CreateCommittedResource(
  132.         &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
  133.         D3D12_HEAP_FLAG_NONE,
  134.         &texDesc,
  135.         D3D12_RESOURCE_STATE_GENERIC_READ,
  136.         &optClear,
  137.         IID_PPV_ARGS(&mShadowMap)));
  138. }